package com.ynu.springbootappdemo.service;

import com.ynu.springbootappdemo.dao.ICategoriesDao;
import com.ynu.springbootappdemo.model.entity.Categories;
import com.ynu.springbootappdemo.model.vo.CateGoodsVo;
import com.ynu.springbootappdemo.model.vo.MainCateGoodsVo;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;

@Service
public class CateService {

    @Resource
    private ICategoriesDao dao;


    @Transactional
    public List<Categories> getAll() {
        return dao.findAllByLayer(2);
    }

    public List<MainCateGoodsVo> mergeFirstCate(List<Categories> categories) {
        // 合并一级分类
        Map<Categories, MainCateGoodsVo> mergedCategories = categories.stream().collect(
                Collectors.toMap(
                        Categories::getParent,  // 使用parentId作为键
                        cate -> {
                            MainCateGoodsVo vo = new MainCateGoodsVo();
                            vo.setParentId(cate.getParent().getId());
                            vo.setParentName(cate.getParent().getName());
                            List<CateGoodsVo> cateGoodsVos = new ArrayList<>();

                            vo.setChildren(cateGoodsVos); // 初始化商品列表
                            return vo;
                        },
                        (existing, replacement) -> {
                            existing.getChildren().addAll(replacement.getChildren());  // 合并商品列表
                            return existing;
                        }
                )
        );
        ArrayList<MainCateGoodsVo> list = new ArrayList<>(mergedCategories.values());
        // 使用Comparator进行排序id进行排序
        list.sort(new Comparator<MainCateGoodsVo>() {
            @Override
            public int compare(MainCateGoodsVo s1, MainCateGoodsVo s2) {
                return s1.getParentId().compareTo(s2.getParentId());
            }
        });
        return list;
    }

    public List<MainCateGoodsVo> mergeSecendCate(List<CateGoodsVo> cateGoodsVos, List<MainCateGoodsVo> mainCateGoodsVos) {
        for (int i = 0; i < mainCateGoodsVos.size(); i++) {
            int finalI = i;
            List<CateGoodsVo> list1 = cateGoodsVos.stream().filter(cateGoodsVo -> Objects.equals(
                    cateGoodsVo.getParentId(), mainCateGoodsVos.get(finalI).getParentId())
            ).collect(Collectors.toList());
            mainCateGoodsVos.get(finalI).setChildren(list1);
        }
        return mainCateGoodsVos;
    }


}
